package jus.poc.prodcons.v4;

import java.io.PrintStream;
import jus.poc.prodcons.*;

/**
 * Le Consommateur est la structure consommatrice de ressources de notre modèle.
 *
 * @author Nunes Thomas <nds.thomas@gmail.com>
 * @author Feng Xu <fengxu1989@gmail.com>
 */
public class Consommateur extends Acteur implements _Consommateur {
    
    protected int nbMessage;
    protected ProdCons buffer;
    protected int id;

    /**
     * Construction d'un consommateur.
     *
     * @param type le type de consommateur
     * @param obs l'observateur
     * @param moyenneTempsDeTraitement
     * @param deviationTempsDeTraitement
     * @throws ControlException
     */
    protected Consommateur(int type, Observateur obs, int moyenneTempsDeTraitement,
            int deviationTempsDeTraitement) throws ControlException {
        
        super(type, obs, moyenneTempsDeTraitement, deviationTempsDeTraitement);
        nbMessage = 0;
    }

    /**
     * Constructeur d'un consommateur à partir de l'id.
     *
     * @param obs l'observateur
     * @param moyenneTempsDeTraitement
     * @param deviationTempsDeTraitement
     * @param buffer
     * @param id Le numero du consommateur
     * @throws ControlException
     */
    public Consommateur(Observateur obs, int moyenneTempsDeTraitement,
            int deviationTempsDeTraitement, ProdCons buffer, int id) throws ControlException {
        
        this(typeConsommateur, obs, moyenneTempsDeTraitement, deviationTempsDeTraitement);
        this.buffer = buffer;
        this.id = id;
    }
    
    @Override
    public int nombreDeMessages() {
        return nbMessage;
    }
    
    @Override
    public void run() {//Optimisation de la v2
        while (1==1) {
            Aleatoire alea = new Aleatoire(moyenneTempsDeTraitement,
                    deviationTempsDeTraitement);
            try {
                sleep(alea.next());
                Message m = buffer.get(this);      
                sleep(alea.next());
                print(System.out, m.toString());
                ((MessageX) m).exemplaireConsomme();
                if (((MessageX) m).estConsomme()) {
                    buffer.LibererConsommation();
                }
                this.nbMessage++;
            } catch (InterruptedException e) {
            } catch (Exception e) {
            }
        }
    }

    /**
     * Imprime le message dans dans la sortie spécifiée.
     *
     * @param sortie
     * @param message
     */
    private void print(PrintStream sortie, String message) {
        sortie.println(message);
    }
    
    @Override
    public String toString() {
        return "Prod" + id;
    }
}
